// const Service = require('egg').Service;
// const jsSHA = require('jssha');

// /*
// * @author JinHang
// * @description 微信公众号服务类
// * @date 2018/6/11 16:06
// * */
// class WeChatService extends Service {

//   /*
//   * @author JinHang
//   * @description 签名方法
//   * @date 2018/6/11 16:07
//   * */
//   async sign() {

//     const accessToken = await this.getAccessToken();

//     if (!accessToken) {

//       return null;

//     }

//     const jsTicket = await this.getTicket(accessToken);

//     if (jsTicket) {

//       return null;

//     }

//     return await this.signAlgorithm(jsTicket, this.ctx.request.href);

//   }

//   /*
//   * @author JinHang
//   * @description 获取access_token的方法
//   * @return {string} access_token || null
//   * @date 2018/6/11 16:17
//   * */
//   async getAccessToken() {

//     const accessToken = await this.app.redis.get('weChatAccessToken');

//     if (accessToken) {

//       return accessToken;

//     } else {

//       const accessTokenResult = await this.ctx.curl('https://api.weixin.qq.com/cgi-bin/token', {
//         dataType: 'json',
//         data: {
//           grant_type: 'client_credential',
//           appid: this.config.weChatConfig.appId,
//           secret: this.config.weChatConfig.secret
//         }
//       });

//       if (accessTokenResult.data.errcode === 0) {

//         // access_token有获取次数限制需要缓存和过期后的重新获取
//         await this.app.redis.set('weChatAccessToken', accessTokenResult.data.access_token, 'EX', accessTokenResult.data.expires_in);

//         return accessTokenResult.data.access_token;

//       } else {

//         this.ctx.logger.error(new Error(`错误码：${accessTokenResult.data.errcode}，错误信息：${accessTokenResult.data.errmsg}`));

//         return null;

//       }

//     }

//   }

//   /*
//   * @author JinHang
//   * @description 获取jsTicket的方法
//   * @param {string} 微信获取access_token后返回的数据
//   * @return {string} jsTicket字符串 || null
//   * @date 2018/6/11 16:19
//   * */
//   async getTicket(accessToken) {

//     const jsTicket = await this.app.redis.get('weChatJsTicket');

//     if (jsTicket) {

//       return jsTicket;

//     } else {

//       const jsTicketResult = await this.ctx.curl('https://api.weixin.qq.com/cgi-bin/ticket/getticket', {
//         dataType: 'json',
//         data: {
//           access_token: accessToken,
//           type: 'jsapi'
//         }
//       });

//       if (jsTicketResult.data.errcode === 0) {

//         // ticket需要缓存和过期后的重新获取
//         await this.app.redis.set('weChatJsTicket', jsTicketResult.data.ticket, 'EX', jsTicketResult.data.expires_in);

//         return jsTicketResult.data.ticket;

//       } else {

//         this.ctx.logger.error(new Error(`错误码：${jsTicketResult.data.errcode}，错误信息：${jsTicketResult.data.errmsg}`));

//         return null;

//       }

//     }

//   }

//   /*
//   * @author JinHang
//   * @description 微信签名算法
//   * @param {string} jsTicket
//   * @param {string} 用于签名的完整的url，需要动态获取 例：http://www.example.com?key=value
//   * @return {object} output已签名的对象，需要传到前端
//   * @date 2018/6/11 16:26
//   * */
//   async signAlgorithm(jsTicket, url) {

//     // 对象的键名必须是这样
//     const output = {
//       jsapi_ticket: jsTicket,
//       noncestr: await this.createNonceStr(),
//       timestamp: await this.createTimestamp(),
//       url
//     };

//     const string = this.formatObjToString(output);

//     const shaObj = new jsSHA(string, 'TEXT');

//     output.signature = shaObj.getHash('SHA-1', 'HEX');

//     return output;

//   }

//   // 随机字符串
//   async createNonceStr() {
//     return Math.random().toString(36).substr(2, 15);
//   }

//   // 时间戳
//   async createTimestamp() {
//     return parseInt(new Date().getTime() / 1000) + '';
//   }

//   /*
//   * @author JinHang
//   * @description 对对象进行字典排序以及键值对拼接
//   * @param {object} obj一个已有时间戳，随机字符串的对象
//   * @return {string} string 是一个加密的签名字符串，复合微信加密算法
//   * @date 2018/6/11 16:30
//   * */
//   async formatObjToString(obj) {

//     let keys = Object.keys(obj);

//     keys = keys.sort();

//     const newArgs = {};

//     keys.forEach(function(key) {
//       newArgs[key.toLowerCase()] = obj[key];
//     });

//     let string = '';

//     for (const k in newArgs) {
//       if (newArgs.hasOwnProperty(k)) {
//         string += '&' + k + '=' + newArgs[k];
//       }
//     }

//     string = string.substr(1);

//     return string;

//   }

// }

// module.exports = WeChatService;